from werkzeug.security import generate_password_hash, check_password_hash
from app.models.user import User
from app.extensions import db


class UserService:
    """用户服务类，处理用户相关业务逻辑"""
    
    def get_all_users(self, page=1, per_page=10):
        """
        获取所有用户（分页）
        
        Args:
            page: 当前页码
            per_page: 每页数量
            
        Returns:
            用户列表
        """
        return User.query.paginate(page=page, per_page=per_page).items
    
    def get_user_by_id(self, user_id):
        """
        根据ID获取用户
        
        Args:
            user_id: 用户ID
            
        Returns:
            用户对象，如果不存在则返回None
        """
        return User.query.get(user_id)
    
    def get_user_by_username(self, username):
        """
        根据用户名获取用户
        
        Args:
            username: 用户名
            
        Returns:
            用户对象，如果不存在则返回None
        """
        return User.query.filter_by(username=username).first()
    
    def create_user(self, user_data):
        """
        创建新用户
        
        Args:
            user_data: 用户数据字典
            
        Returns:
            新创建的用户对象
        """
        # 创建用户对象
        user = User(
            username=user_data['username'],
            email=user_data['email'],
            password=generate_password_hash(user_data['password']),
            role=user_data.get('role', 'user')
        )
        
        # 添加到数据库
        db.session.add(user)
        db.session.commit()
        
        return user
    
    def update_user(self, user_id, user_data):
        """
        更新用户信息
        
        Args:
            user_id: 用户ID
            user_data: 用户数据字典
            
        Returns:
            更新后的用户对象，如果用户不存在则返回None
        """
        # 获取用户
        user = self.get_user_by_id(user_id)
        if not user:
            return None
        
        # 更新用户信息
        if 'username' in user_data:
            user.username = user_data['username']
        
        if 'email' in user_data:
            user.email = user_data['email']
        
        if 'password' in user_data:
            user.password = generate_password_hash(user_data['password'])
        
        if 'role' in user_data:
            user.role = user_data['role']
        
        # 提交更改
        db.session.commit()
        
        return user
    
    def delete_user(self, user_id):
        """
        删除用户
        
        Args:
            user_id: 用户ID
            
        Returns:
            操作是否成功
        """
        # 获取用户
        user = self.get_user_by_id(user_id)
        if not user:
            return False
        
        # 删除用户
        db.session.delete(user)
        db.session.commit()
        
        return True
    
    def verify_password(self, username, password):
        """
        验证用户密码
        
        Args:
            username: 用户名
            password: 密码
            
        Returns:
            如果验证成功则返回用户对象，否则返回None
        """
        # 获取用户
        user = self.get_user_by_username(username)
        if not user:
            return None
        
        # 验证密码
        if not check_password_hash(user.password, password):
            return None
        
        return user 